<?php
namespace app\index\controller;

use app\first\model\ActiveOrder;
use app\first\model\ArticleOrder;
use app\first\model\ShopGoodsOrder;
use service\Iloger;
use think\Controller;
use think\facade\Config;
use Yansongda\Pay\Pay;

class Payment extends Controller{
    public function index(){
        Iloger::write('wechat_pay','notify',[
            'name'=> 'payment',
            'action'=>'index',
            'message'=> 'test'
        ]);
        echo  '支付控制器';
    }

    public function wechat_notify(){
        //http://jiexun.3qiy.com/index/payment/wechat_notify
        $wechat = Pay::wechat(Config::get('wechat.'));
        try{
            $data = $wechat->verify(); // 是的，验签就这么简单！
            $data = $data->all();
            if($data['result_code']=='SUCCESS'){
                $out_trade_no = $data['out_trade_no'];
                $transaction_id = $data['transaction_id'];
                $total_fee = $data['total_fee'];
//                $time_end = $data['time_end'];
                if(startWith($out_trade_no,'goods_')){ // 商品
                    $order = new ShopGoodsOrder();
                    $order->confirm($data['out_trade_no'],$transaction_id,$total_fee);
                }
                if(startWith($out_trade_no,'ati_')){ // 发布
                    $order = new ArticleOrder();
                    $order->confirm($data['out_trade_no'],$transaction_id,$total_fee);
                }
                if(startWith($out_trade_no,'active_')){ // 活动
                    $order = new ActiveOrder();
                    $order->confirm($data['out_trade_no'],$transaction_id,$total_fee);
                }
                //file('', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
                Iloger::write('wechat_pay','notify',$data);
                echo 'success';
            }else{
                echo 'error';
            }
        } catch (\Exception $e) {
            Iloger::write('wechat_pay','error',$e);
        }
    }

    /**
     * @throws \Yansongda\Pay\Exceptions\InvalidConfigException
     * @throws \Yansongda\Pay\Exceptions\InvalidSignException
     * @throws \think\Exception
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\ModelNotFoundException
     * @throws \think\exception\DbException
     */
    public function alipay_notify(){
        $alipay = Pay::alipay(Config::get('alipay.'));
        $data = $alipay->verify()->all();
        try{
            if($data['trade_status']=='TRADE_SUCCESS'){
                $out_trade_no = $data['out_trade_no'];
                $transaction_id = $data['trade_no'];
                $total_fee = $data['total_amount'];
                if(startWith($out_trade_no,'goods_')){
                    $order = new ShopGoodsOrder();
                    $order->confirm($data['out_trade_no'],$transaction_id,$total_fee,2);
                }
                if(startWith($out_trade_no,'ati_')){ // 发布
                    $order = new ArticleOrder();
                    $order->confirm($data['out_trade_no'],$transaction_id,$total_fee,2);
                }
                if(startWith($out_trade_no,'active_')){ // 活动
                    $order = new ActiveOrder();
                    $order->confirm($data['out_trade_no'],$transaction_id,$total_fee,2);
                }
                Iloger::write('alipay_pay','notify',$data);
                echo 'success';
            }else{
                echo 'error';
            }
        } catch (\Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * @return string|\think\response\Json
     */
    public function alipay_return(){
        //http://jiexun.3qiy.com/index/payment/alipay_return
        $wechat = Pay::alipay(Config::get('alipay.'));
        try{
            $data = $wechat->verify(); // 是的，验签就这么简单！
            // 请自行对 trade_status 进行判断及其它逻辑进行判断，在支付宝的业务通知中，
            //只有交易通知状态为 TRADE_SUCCESS 或 TRADE_FINISHED 时，支付宝才会认定为买家付款成功。
            // 1、商户需要验证该通知数据中的out_trade_no是否为商户系统中创建的订单号；
            // 2、判断total_amount是否确实为该订单的实际金额（即商户订单创建时的金额）；
            // 3、校验通知中的seller_id（或者seller_email) 是否为out_trade_no这笔单据的对应的操作方（有的时候，一个商户可能有多个seller_id/seller_email）；
            // 4、验证app_id是否为该商户本身。
            // 5、其它业务逻辑情况
//            Log::debug('Alipay_notify', $data->all());
            Iloger::write('alipay_return','notify',$data->all());
            return json($data->toArray());
        } catch (\Exception $e) {
            return $e->getMessage();
        }
    }

    /**
     * @param string $out_trade_no
     * @return \Yansongda\Supports\Collection
     * @throws \Yansongda\Pay\Exceptions\GatewayException
     * @throws \Yansongda\Pay\Exceptions\InvalidConfigException
     * @throws \Yansongda\Pay\Exceptions\InvalidSignException
     */
    public function query($out_trade_no='goods_2020041398979899'){
        $pay = Pay::alipay(Config::get('alipay.'));
        $result = $pay->find($out_trade_no);
        return $result;
    }
}